package com.xlhl.init.common;

import cn.hutool.core.util.ObjUtil;
import com.xlhl.init.exceptipn.BusinessException;
import com.xlhl.init.utils.ThrowUtil;
import lombok.Data;

import java.io.Serial;
import java.lang.reflect.Field;

/**
 * 编辑请求封装父类
 * <p>
 * 继承此父类会校验 编辑请求封装体 会校验ID是否为空。
 * <p>
 * 并且校验 除ID、serialVersionUID以外的其他参数是否全部为空
 *
 * @author xlhl
 */
@Data
public class EditRequestBody implements Validatable {

    @Serial
    private static final long serialVersionUID = 7392414935773426323L;
    /**
     * 忽略 ID 属性名
     */
    private static final String IGNORED_FIELD_ID = "id";

    /**
     * 忽略 serialVersionUID 属性名
     */
    private static final String IGNORED_SERIAL_VERSION_UID = "serialVersionUID";


    /**
     * 主键 ID
     */
    private Long id;

    /**
     * 是否全部为空 ID serialVersionUID 除外
     */
    protected void isAllNull() {
        Class<? extends EditRequestBody> clazz = this.getClass();
        Field[] fields = clazz.getDeclaredFields();

        if (fields.length <= 4) {
            return;
        }

        for (Field field : fields) {
            try {
                String fieldName = field.getName();
                if (IGNORED_FIELD_ID.equals(fieldName) || IGNORED_SERIAL_VERSION_UID.equals(fieldName)) {
                    continue;
                }

                field.setAccessible(true);
                Object value = field.get(this);

                if (validParams(value)) {
                    return;
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }

        throw new BusinessException("请至少填写一项修改");
    }

    @Override
    public void doValidate() throws BusinessException {
        ThrowUtil.throwIf(this.id == null, new RuntimeException("ID 不能为空"));
        isAllNull();
    }

    /**
     * 校验参数
     *
     * @param value 是否为空
     * @return 非空->true 空->false
     */
    protected boolean validParams(Object value) {
        return ObjUtil.isNotNull(value) && ObjUtil.isNotEmpty(value);
    }
}












